<?php
/* *
 * 功能：支付宝服务器异步通知页面
 * 版本：3.3
 * 日期：2012-07-23
 * 说明：
 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。


 *************************页面功能说明*************************
 * 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
 * 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
 * 该页面调试工具请使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyNotify
 * 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
 */

error_reporting(E_ALL);
ini_set('display_errors', 1);
define('ROOT_PATH', dirname(__FILE__));
define('FRAMEWORK_PATH', ROOT_PATH . '/framework');
define('PROTECTED_PATH', ROOT_PATH . '/protected');
define('APP_PATH', PROTECTED_PATH . '/api');
define('MODEL_PATH', PROTECTED_PATH . '/model');
require_once(PROTECTED_PATH . '/config.php');
require_once(FRAMEWORK_PATH . '/global.php');
require_once(FRAMEWORK_PATH . '/wenyan.php');
require_once(APP_PATH . '/core.php');
require_once(MODEL_PATH . '/base.model.php');

if (!get_magic_quotes_gpc()) {
    $_GET   = addslashes_deep($_GET);
    $_POST  = addslashes_deep($_POST);
    $_COOKIE = addslashes_deep($_COOKIE);
    $_SERVER = addslashes_deep($_SERVER);
}

//require_once(PROTECTED_PATH."/alipay.config.php");
require_once(FRAMEWORK_PATH."/class/alipay/alipay.config.php");
require_once(FRAMEWORK_PATH."/class/alipay/lib/alipay_notify.class.php");

//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
write_log(json_encode($_POST));
//write_log("...check..");
if ($verify_result) {//验证成功
//if (true) {
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//请在这里加上商户的业务逻辑程序代


	//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

    //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

	//商户订单号

	$out_trade_no = $_POST['out_trade_no'];
	//$out_trade_no = "2015111868514";


	//支付宝交易号

	$trade_no = $_POST['trade_no'];

	//交易状态
	$trade_status = $_POST['trade_status'];
	write_log($trade_no);

	//只有支付成功才处理
	if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
	//if(true) {

		//购买订单
		//$sql = "UPDATE mmx_order SET status=1 WHERE id='{$out_trade_no}'";
		//先判断是否为单个订单（从会员中心我的订单处支付），如果是，则处理该订单，否则，为分单后的总订单
		$flag = substr($out_trade_no, 0, 2);
		//echo $flag;exit;
		if ($flag == 'CZ') { //充值
			$sql = "SELECT * FROM {$tbp}member_recharge WHERE order_sn='{$out_trade_no}'";
			write_log($sql);
			$row = $db->get_row($sql);
			if ($row && $row->status==0) {
				$sql = "UPDATE {$tbp}member_recharge SET status='1', pay_time='".time()."', trade_no='{$trade_no}' WHERE order_sn='{$out_trade_no}'";
				write_log($sql);
				$db->query($sql);
				$sql = "UPDATE {$tbp}member SET `money`=`money`+{$row->recharged_money} WHERE id='{$row->member_id}'";
				write_log($sql);
				$db->query($sql);
				$sql = "INSERT INTO {$tbp}member_money_history(member_id, `money`, memo, type, parent_id, add_time, status)
					VALUES('{$row->member_id}', '{$row->recharged_money}', '余额充值', '2', '{$row->id}', '".time()."', '1')";
				write_log($sql);
				$db->query($sql);
			}
		} else if ($flag == 'DJ') { //等级
			$sql = "UPDATE {$tbp}member_grade_order SET status='1', pay_time='".time()."', trade_no='{$trade_no}' WHERE order_sn='{$out_trade_no}'";
			write_log($sql);
			$db->query($sql);
			$sql = "SELECT member_id, grade_id FROM {$tbp}member_grade_order WHERE order_sn='{$out_trade_no}'";
			write_log($sql);
			$row = $db->get_row($sql);
			if ($row) {
				$sql = "SELECT score FROM {$tbp}member_grade WHERE id='{$row->grade_id}'";
				write_log($sql);
				$score = intval($db->get_var($sql));
				$sql = "UPDATE {$tbp}member SET grade_id='{$row->grade_id}', grade_score='{$score}' WHERE id='{$row->member_id}'";
				write_log($sql);
				$db->query($sql);
				$member_mod = m('member');
				$member_mod->update_grade_from_score($row->member_id);
			}
		} else { //订单
			$sql = "SELECT * FROM {$tbp}order WHERE pay_order_sn='{$out_trade_no}' OR parent_order_sn='{$out_trade_no}'";
			write_log($sql);
			$rs = $db->get_results($sql);
			if ($rs) {
				$member_id = 0;
				$integral = 0;
				foreach ($rs as $k=>$o) {
					$sql = "UPDATE {$tbp}order SET status='1', pay_time='".time()."', trade_no='{$trade_no}' WHERE id='{$o->id}'";
					write_log($sql);
					$db->query($sql);
					//增加积分
					$sql = "SELECT g.give_integral, og.quantity FROM {$tbp}goods g LEFT JOIN {$tbp}order_goods og ON og.goods_id=g.id
						WHERE og.order_id='{$o->id}'";
					write_log($sql);
					$goods = $db->get_results($sql);
					if ($goods) {
						foreach ($goods as $kg=>$g) {
							$integral += $g->give_integral * $g->quantity;
						}
					}
					$member_id = $o->member_id;
				}
				$sql = "UPDATE {$tbp}member SET `integral`=`integral`+{$integral} WHERE id='{$member_id}'";
				write_log($sql);
				$db->query($sql);
				//调用订单支付成功接口,更新库存、销量等
				$cart = c('cart');
				$_GET = array('order_sn'=>$out_trade_no);
				$cart->order_complete(false);
			}
		}
		write_log("\n==============================");

	}
	else if ($_POST['trade_status'] == 'TRADE_FINISHED') {
		//判断该笔订单是否在商户网站中已经做过处理
			//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
			//如果有做过处理，不执行商户的业务程序

		//注意：
		//该种交易状态只在两种情况下出现
		//1、开通了普通即时到账，买家付款成功后。
		//2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。

        //调试用，写文本函数记录程序运行情况是否正常
        //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
    }

	//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

	echo "success";		//请不要修改或删除

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
    //验证失败
    write_log(json_encode($verify_result));
    write_log("\nalipay fail\n==============================");
    echo "fail";

    //调试用，写文本函数记录程序运行情况是否正常
    //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
}
?>
